/**
//batter manager
**/
#include <stdbool.h>
#include <stdint.h>
#include "nrf.h"
#include "nrf_gpiote.h"
#include "nrf_gpio.h"
//#include "boards.h"
#include "nrf_drv_ppi.h"
#include "nrf_drv_gpiote.h"
#include "app_error.h"
#include "app_timer.h"
#include "nrf_saadc.h"
#include "nrf_drv_saadc.h"
#include "nrf_log.h"
#include "board_cfg.h"


#define BAT_ADC_PERIOD      20  //电池ADC采集周期，单位秒


//电池放电曲线
uint32_t bat_vot_lev[100] = 
{
    4094, 4080, 4069, 4059, 4050, 4042, 4034, 4024, 4019, 4008,
    3996, 3989, 3976, 3969, 3965, 3960, 3950, 3942, 3936, 3930,
    3923, 3917, 3913, 3905, 3900, 3890, 3882, 3877, 3869, 3865,
    3860, 3851, 3846, 3843, 3835, 3830, 3825, 3818, 3814, 3808,
    3805, 3799, 3795, 3791, 3788, 3785, 3782, 3780, 3775, 3773,
    3770, 3768, 3766, 3764, 3762, 3760, 3758, 3756, 3754, 3752,
    3750, 3748, 3746, 3744, 3742, 3740, 3738, 3736, 3734, 3732,
    3729, 3727, 3725, 3722, 3720, 3719, 3715, 3711, 3707, 3701,
    3696, 3691, 3685, 3683, 3677, 3669, 3663, 3659, 3655, 3653,
    3648, 3641, 3638, 3618, 3606, 3580, 3531, 3470, 3375, 3200,
};



uint32_t    bat_volt            = 0;
static uint8_t  g_bat_perecent      = 0;
static bool     chg_state_cur       = false;
static bool     chg_full_state_cur  = false;

void bat_hw_init(void)
{
    //充电检测
    nrf_gpio_cfg_input(BAT_CHG_PIN, NRF_GPIO_PIN_PULLUP);

    //满电检测
    nrf_gpio_cfg_input(BAT_CHG_FULL_PIN, NRF_GPIO_PIN_PULLUP);

    //AD采集
}

void bat_manager_chg_check(void)
{
    
}

//*****************************************************************************
// * 函 数 名  : bat_get_percent
// * 函数功能  : 电量百分百查询
// * 输入参数  :	 无
// * 输出参数  : 无
// * 返 回 值  : 0-100
//*****************************************************************************/
uint8_t bat_get_percent(void)
{
    if (101 == g_bat_perecent)
    {
        return 0;
    }
    else
    {
        return g_bat_perecent;
    }
}

//*****************************************************************************
// * 函 数 名  : bat_volt_to_percent
// * 函数功能  : 电压转电量百分比
// * 输入参数  :	 bat_volt： 电压
// * 输出参数  : 无
// * 返 回 值  : 电量：0-100
//*****************************************************************************/
static uint8_t bat_volt_to_percent(uint32_t bat_volt)
{
    uint8_t bat_percent = 0;

    uint8_t i = 0;
    
    for (i = 0; i < 100; i++)
    {
        if (bat_volt >= bat_vot_lev[i])
        {
            bat_percent = 100 - i;
            break;
        }
    }

    if (100 == i)
    {
        bat_percent = 0;
    }

    return bat_percent;
}

//*****************************************************************************
// * 函 数 名  : bat_get_lev
// * 函数功能  : 电量等级状态查询
// * 输入参数  :	 无
// * 输出参数  : 无
// * 返 回 值  : 1；低电量； 2：中等电量： 3：高电量； 4：满电量
//*****************************************************************************/
uint8_t bat_get_lev(void)
{
    uint8_t bat_lev = 0;

    if (g_bat_perecent < 30)
    {
        bat_lev = 1;
    }
    else if (g_bat_perecent < 50)
    {
        bat_lev = 2;
    }
    else if (g_bat_perecent < 80)
    {
        bat_lev = 3;
    }
    else
    {
        bat_lev = 4;
    }

    return bat_lev;
}

//*****************************************************************************
// * 函 数 名  : bat_get_charging_stat
// * 函数功能  : 电池充电状态查询
// * 输入参数  :	 无
// * 输出参数  : 无
// * 返 回 值  : 0:未充电； 1：充电中； 2：充满电
//*****************************************************************************/
uint8_t bat_get_charging_stat(void)
{
    if (chg_full_state_cur)
    {
        return 2;
    }
    else if (chg_state_cur)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}


//*****************************************************************************
// * 函 数 名  : bat_timer_handler
// * 函数功能  : 电池状态周期处理函数
// * 输入参数  :	 无
// * 输出参数  : 无
// * 返 回 值  : 无
//*****************************************************************************/
void bat_timer_handler(void)
{
    nrf_saadc_value_t  saadc_val;
//    float  val;  //保存SAADC采样数据计算的实际电压值

    static uint8_t time         = BAT_ADC_PERIOD;

    uint8_t     bat_per         = 0;
    uint32_t    bat_volt        = 0;


    //达到电池电压采集周期
    if (++time >= BAT_ADC_PERIOD)
    {
        //启动一次ADC采样。
        nrf_drv_saadc_sample_convert(0, &saadc_val);

        uint32_t ad_value = saadc_val;
        
        //串口输出ADC采样值。
        bat_volt = 2* ad_value * 3600 /1024;
        NRF_LOG_INFO("timer_handler: bat_volt = %u", bat_volt);

        bat_per = bat_volt_to_percent(bat_volt);
        
        //第一次检测电量
        if (101 == g_bat_perecent)
        {
            g_bat_perecent = bat_per;
        }
        else
        {
            //充电状态，电量只升不降
            if (chg_state_cur)
            {
                if (bat_per > g_bat_perecent)
                {
                    g_bat_perecent = bat_per;
                }
            }
            //放电状态，电量只降不升
            else
            {
                if (bat_per < g_bat_perecent)
                {
                    g_bat_perecent = bat_per;
                }
            }
        }

        time = 0;
    }

//    NRF_LOG_INFO("charging = %d, full = %d", nrf_gpio_pin_read(BAT_CHG_PIN), nrf_gpio_pin_read(BAT_CHG_FULL_PIN));

    //满电
    if (0 == nrf_gpio_pin_read(BAT_CHG_FULL_PIN))
    {
        chg_full_state_cur = true;
        chg_state_cur = true;
    }
    else
    {
        chg_full_state_cur = false;

        //充电
        if (0 == nrf_gpio_pin_read(BAT_CHG_PIN))
        {
            chg_state_cur = true;
        
        }
        else
        {
            chg_state_cur = false;
        }
        
    }
    
}

void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
{
//   
}

//saadc的初始化
void saadc_init(void)
{
    ret_code_t err_code;
    nrf_saadc_channel_config_t channel_config = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);
    
	//初始化saadc
    err_code = nrf_drv_saadc_init(NULL, saadc_callback);
    APP_ERROR_CHECK(err_code);

	//加入通道配置
    err_code = nrf_drv_saadc_channel_init(0, &channel_config);
    APP_ERROR_CHECK(err_code);

}


void bat_manager_init(void)
{
    g_bat_perecent = 101;

    //初始化配置IO
	bat_hw_init();

	//调用模块初始化
    saadc_init();
}


